<?php


namespace app\pay\controller;


use app\BaseController;
use app\service\model\OrderModel;
use app\service\model\VoucherModel;
use app\service\Wechat;
use EasyWeChat\Factory;
use think\Exception;
use think\facade\Db;

class WxpayNotify extends BaseController
{

    /**
     * 微信支付回调
     * @throws \EasyWeChat\Kernel\Exceptions\Exception
     */
    public function order()
    {
        $config = config('wechat.payment', []);
        $app = Factory::payment($config);
        $response = $app->handlePaidNotify(function($message, $fail){
            // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
            $order = OrderModel::where('order_no', '=', $message['out_trade_no'])->find();
            if (!$order) { // 如果订单不存在 或者 订单已经支付过了
                file_put_contents(runtime_path() . 'wxpay_order.log', date("Y-m-d H:i:s")."//订单不存在，订单号：". $message['out_trade_no'] ."\n", FILE_APPEND);
                return true; // 告诉微信，我已经处理完了，订单没找到，别再通知我了
            }

            if ($order->status != 1) { // 如果订单不存在 或者 订单已经支付过了
                file_put_contents(runtime_path() . 'wxpay_order.log', date("Y-m-d H:i:s")."//订单状态不是待支付，订单号：". $message['out_trade_no'] ."，订单状态". $order->status ."\n", FILE_APPEND);
                return true; // 告诉微信，我已经处理完了，订单没找到，别再通知我了
            }

            if ($message['total_fee'] != 1 && $message['total_fee'] != $order->unpaid * 100) {
                file_put_contents(runtime_path() . 'wxpay_order.log', date("Y-m-d H:i:s")."//支付金额错误，订单号：". $message['out_trade_no'] ."，支付金额". $message['total_fee'] ."\n", FILE_APPEND);
                return true;
            }

            ///////////// <- 建议在这里调用微信的【订单查询】接口查一下该笔订单的情况，确认是已经支付 /////////////
            if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态，不代表支付状态
                // 用户是否支付成功
                if ($message['result_code'] === 'SUCCESS') {
                    Db::startTrans();
                    try {
                        $order->pay_time = date('Y-m-d H:i:s'); // 更新支付时间为当前时间
                        $order->pay_total = $message['total_fee'] / 100;
                        $order->pay_type = 1;
                        $order->status = 2;

                        $order->save(); // 保存订单

                        // 赠送抵扣券
                        VoucherModel::create([
                            'member_id' => $order->member_id,
                            'money' => (int)bcdiv($order->unpaid, 10),
                            'order_id' => $order->id,
                        ]);

                        // 发送通知
                        $goods_info = '';
                        foreach($order->order_goods as $order_goods) {
                            $goods_info .= $order_goods->goods->name . '('. $order_goods->attribute .')' . "\n";
                        };
                        (new Wechat())->create_order_for_shop($order->address, $order->unpaid, $order->remark, $goods_info);
                        Db::commit();
                    } catch (Exception $e) {
                        Db::rollback();
                        file_put_contents(runtime_path() . 'wxpay_order.log', date("Y-m-d H:i:s")."//支付失败，". $e->getMessage() ."，订单号：". $message['out_trade_no'] ."\n", FILE_APPEND);
                        return $fail('通信失败，请稍后再通知我');
                    }
                }
            } else {
                return $fail('通信失败，请稍后再通知我');
            }
            return true; // 返回处理完成
        });

        $response->send(); // return $response;
    }
}